package com.common.fileupload.config;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;

/**
 * 对象存储配置
 *
 * @author Tango
 * @since 2022/6/27
 */

@ConditionalOnProperty(name = "upload.impl")
@ConfigurationProperties("upload")
@RequiredArgsConstructor
@Setter
@Getter
public class S3UploaderConfig {



    //地址
    private String endPoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;
    //TODO 待优化
    private String impl;


    //refresh scope
    private final ConcurrentHashMap<Class<?>, Object> clientMap = new ConcurrentHashMap<>();


    @SuppressWarnings("unchecked")
    public final <T> T getClient(Class<T> clientClass, Function<S3UploaderConfig, T> fn) {
        /**computeIfAbsent 函数：如果指定的键不存在
         （或与 null 关联），则通过指定的函数计算一个值，并将该键与计算得到的值关联起来。
         eg:
         ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
         // 使用 computeIfAbsent 方法计算键值对
         String key = "A";
         concurrentMap.computeIfAbsent(key, k -> 1); // 如果 key 不存在，则将 key 与值 1 关联起来

         System.out.println(concurrentMap.get(key)); // 输出 1

         // 另一个示例，如果 key 已经存在，则不会执行 mappingFunction
         concurrentMap.computeIfAbsent(key, k -> 2); // key 已存在，不会执行 mappingFunction

         System.out.println(concurrentMap.get(key)); // 输出 1，因为 key 已经存在，值不会被更新
         */
        return (T) clientMap.computeIfAbsent(clientClass, key -> fn.apply(this));
    }


    public final String getPrefix() {
        if ("ali".equals(impl)) {
            return "https://" + bucketName + "." + endPoint.split("://")[1];
        }else{
            return endPoint + "/" + bucketName;
        }
    }

    public final String getUrl(String objectName) {
        return getPrefix() + "/" + objectName;
    }


}
